home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / source / hotspot / vbx / movie.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-03  |  10.1 KB  |  350 lines

  1. /**************************************************************************
  2.  *
  3.  *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4.  *  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5.  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6.  *  PURPOSE.
  7.  *
  8.  *  Copyright (c) 1993  Microsoft Corporation.  All Rights Reserved.
  9.  * 
  10.  **************************************************************************/
  11. /*
  12.     movie.c:
  13.         positionMovie -- puts movie in upper left corner of window
  14.         fileCloseMovie -- closes movie & clears fPlaying and fMovieOpen
  15.         GetMovieLength -- returns number of frames in movie
  16.         GetMovieFrame -- returns current frame of movie
  17.         fileOpenMovie -- opens an AVI movie, optionally using a common
  18.             dialog box.  Movie is displayed paused when opened.
  19.         playMovie -- plays or pauses the movie
  20.         setMovie -- sets movie to specified frame
  21.         seekMovie -- go to beginning or end of movie
  22.         stepMovie -- go forwards or backwards one frame
  23. */
  24.  
  25. #include <windows.h>
  26. #include <mmsystem.h>
  27. #include <digitalv.h>
  28. #include <mciavi.h>
  29.  
  30. #include "hotspot.h"
  31.  
  32. LONG FAR PASCAL _export ICAVIDrawProc(DWORD id, HDRVR hDriver,
  33.     UINT uiMessage, LPARAM lParam1, LPARAM lParam2);
  34.  
  35. /*
  36.     positionMovie -- gets the client rect of the parent window, gets the
  37.         size of the movie with MCI_WHERE, sets up a rect for the movie
  38.         to go in, and calls MoveWindow to move the child window,
  39.         and the movie, there.
  40. */
  41. VOID positionMovie(PMOVIEINFO pMovieInfo, SHORT x, SHORT y)
  42. {
  43.     RECT rcClient, rcMovieBounds;
  44.     MCI_DGV_RECT_PARMS   mciRect;
  45.     BOOL retcode = TRUE;
  46.     
  47.     if (!pMovieInfo->fMovieOpen)
  48.         return;
  49.     GetClientRect(pMovieInfo->hwndParent, &rcClient);
  50.     
  51.     mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_WHERE,
  52.         (DWORD)(MCI_DGV_WHERE_SOURCE),
  53.         (DWORD)(LPMCI_DGV_RECT_PARMS)&mciRect);
  54.         
  55.     rcMovieBounds = mciRect.rc;
  56.     pMovieInfo->rcMovie.left = x;
  57.     pMovieInfo->rcMovie.top = y;
  58.     pMovieInfo->rcMovie.right = pMovieInfo->rcMovie.left + rcMovieBounds.right +1;
  59.     pMovieInfo->rcMovie.bottom = pMovieInfo->rcMovie.top + rcMovieBounds.bottom +1;
  60.     
  61.     MoveWindow(pMovieInfo->hwndMovie, pMovieInfo->rcMovie.left, pMovieInfo->rcMovie.top,
  62.         rcMovieBounds.right, rcMovieBounds.bottom, TRUE);
  63. }
  64. /*
  65.     fileCloseMovie -- uses MCI_CLOSE to close the movie, and
  66.         InvalidateRect to make the movie actually disappear from
  67.         the screen.  DeleteHotspotList is called to get rid of the
  68.         hotspots.
  69. */
  70. void fileCloseMovie(PMOVIEINFO pMovieInfo, BOOL bUpdate)
  71. {
  72.     MCI_GENERIC_PARMS  mciGeneric;
  73.     
  74.     pMovieInfo->fPlaying = FALSE;
  75.     pMovieInfo->fMovieOpen = FALSE;
  76.     RemoveProp(pMovieInfo->hwndMovie, (LPSTR) "DataLo");
  77.     RemoveProp(pMovieInfo->hwndMovie, (LPSTR) "DataHi");
  78.     RemoveProp(pMovieInfo->hwndParent, (LPSTR) "DataLo");
  79.     RemoveProp(pMovieInfo->hwndParent, (LPSTR) "DataHi");
  80.     
  81.     mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_CLOSE, MCI_WAIT,
  82.         (DWORD)(LPMCI_GENERIC_PARMS)&mciGeneric);
  83.     
  84.     if (bUpdate)
  85.     {
  86.         InvalidateRect(pMovieInfo->hwndParent, NULL, TRUE);
  87.         UpdateWindow(pMovieInfo->hwndParent);
  88.     }
  89.     DeleteHotspotList(pMovieInfo);
  90. }
  91.  
  92. /*
  93.     GetMovieLength -- uses MCI_STATUS to find out number of frames in
  94.         movie.
  95. */
  96. DWORD GetMovieLength(PMOVIEINFO pMovieInfo)
  97. {
  98.     MCI_STATUS_PARMS mciStatus;
  99.     
  100.     mciStatus.dwTrack = 1;
  101.     mciStatus.dwCallback = NULL;
  102.     mciStatus.dwItem = MCI_STATUS_LENGTH;
  103.     
  104.     if (0 != (mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_STATUS, (DWORD)MCI_STATUS_ITEM,
  105.                     (DWORD)(LPMCI_STATUS_PARMS)&mciStatus)))
  106.     {
  107.         return 0;
  108.     }
  109.     return (mciStatus.dwReturn);
  110. }
  111.  
  112. /*
  113.     GetMovieFrame -- uses MCI_STATUS to get current frame of movie.
  114. */
  115. DWORD GetMovieFrame(PMOVIEINFO pMovieInfo)
  116. {
  117.     MCI_STATUS_PARMS mciStatus;
  118.     
  119.     mciStatus.dwTrack = 1;
  120.     mciStatus.dwCallback = NULL;
  121.     mciStatus.dwItem = MCI_STATUS_POSITION;
  122.     
  123.     if (0 != (mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_STATUS, (DWORD)MCI_STATUS_ITEM,
  124.                     (DWORD)(LPMCI_STATUS_PARMS)&mciStatus)))
  125.     {
  126.         return 0;
  127.     }
  128.     return (mciStatus.dwReturn);
  129. }
  130.  
  131. /*
  132.     fileOpenMovie --
  133.         uses MCI_OPEN to open the AVI file. Saves the device ID so we
  134.             can do stuff like find the frame size.
  135.         uses MCI_WINDOW to show the playback window
  136.         uses MCI_DGV_STATUS_HWND to get a handle to the window
  137.         gets the movie length with GetMovieLength, and
  138.         positions the movie with positionMovie.
  139.         Uses InvalidateRect to get window repainted (which will show
  140.         the first frame)
  141.         
  142.         Gives user an annoying messagebox if this doesn't work.
  143.         
  144. */
  145. void fileOpenMovie(PMOVIEINFO pMovieInfo, LPSTR szFilename, SHORT x, SHORT y)
  146. {
  147.     if (pMovieInfo == NULL)
  148.     {
  149.         return;
  150.     }
  151.     if (lstrlen(szFilename))
  152.     {
  153.         MCI_DGV_OPEN_PARMS mciOpen;
  154.         MCI_DGV_WINDOW_PARMS   mciWindow;
  155.         MCI_DGV_STATUS_PARMS   mciStatus;
  156.         
  157.         if (pMovieInfo->fMovieOpen)
  158.             fileCloseMovie(pMovieInfo, TRUE);
  159.  
  160.         mciOpen.dwCallback = NULL;
  161.         mciOpen.wDeviceID = mciOpen.wReserved0 =
  162.         mciOpen.wReserved1 = 0;
  163.         mciOpen.lpstrDeviceType = NULL;
  164.         mciOpen.lpstrElementName = szFilename;
  165.         mciOpen.lpstrAlias = NULL;
  166.         mciOpen.dwStyle = WS_CHILD;
  167.         mciOpen.hWndParent = pMovieInfo->hwndParent;
  168.     
  169.         if (mciSendCommand(0, MCI_OPEN,
  170.                     (DWORD)(MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS),
  171.                 (DWORD)(LPMCI_DGV_OPEN_PARMS)&mciOpen) == 0)
  172.         {
  173.             pMovieInfo->wMCIDeviceID = mciOpen.wDeviceID;
  174.             pMovieInfo->fMovieOpen = TRUE;
  175.  
  176.             mciWindow.dwCallback = NULL;
  177.             mciWindow.hWnd = pMovieInfo->hwndParent;
  178.             mciWindow.wReserved1 = mciWindow.wReserved2 = 0;
  179.             mciWindow.nCmdShow = SW_SHOW;
  180.             mciWindow.lpstrText = (LPSTR)NULL;
  181.  
  182.             mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_WINDOW,
  183.                 MCI_DGV_WINDOW_STATE | MCI_DGV_WINDOW_HWND,
  184.                 (DWORD)(LPMCI_DGV_WINDOW_PARMS)&mciWindow);
  185.  
  186.             mciStatus.dwItem = MCI_DGV_STATUS_HWND;
  187.  
  188.             mciSendCommand(pMovieInfo->wMCIDeviceID,
  189.                 MCI_STATUS, MCI_STATUS_ITEM,
  190.                 (DWORD)(LPMCI_STATUS_PARMS)&mciStatus);
  191.  
  192.             pMovieInfo->hwndMovie = (HWND)mciStatus.dwReturn;
  193.             pMovieInfo->dwMovieLength = GetMovieLength(pMovieInfo);
  194.             pMovieInfo->dwCurrentFrame = 0;
  195.  
  196.             SetProp(pMovieInfo->hwndMovie, (LPSTR) "DataLo", LOWORD(pMovieInfo));
  197.             SetProp(pMovieInfo->hwndMovie, (LPSTR) "DataHi", HIWORD(pMovieInfo));
  198.             SetProp(pMovieInfo->hwndParent, (LPSTR) "DataLo", LOWORD(pMovieInfo));
  199.             SetProp(pMovieInfo->hwndParent, (LPSTR) "DataHi", HIWORD(pMovieInfo));
  200.  
  201.             positionMovie(pMovieInfo,x,y);
  202.             {
  203.                 MCI_DGV_SETVIDEO_PARMS    dgv;
  204.                 UINT                    uDevice;
  205.                 
  206.                 dgv.dwValue = (DWORD) ICAVIDrawProc;
  207.                 dgv.dwItem = MCI_AVI_SETVIDEO_DRAW_PROCEDURE;
  208.                 uDevice = pMovieInfo->wMCIDeviceID;
  209.                 if (uDevice)
  210.                 {
  211.                     DWORD dw;
  212.                     
  213.                     dw = mciSendCommand(uDevice,
  214.                         MCI_SETVIDEO,
  215.                         MCI_DGV_SETVIDEO_ITEM | MCI_DGV_SETVIDEO_VALUE,
  216.                         (DWORD) (MCI_DGV_SETVIDEO_PARMS FAR *)&dgv);
  217.                     if (dw != 0)
  218.                     {
  219.                         MessageBox(GetFocus(),
  220.                             "The currently installed MCIAVI does not "
  221.                             "support the MCI_AVI_SETVIDEO_DRAW_PROCEDURE "
  222.                             "command during play.","MCI Problem",
  223.                             MB_OK | MB_ICONHAND);
  224.                     }
  225.                 }
  226.                 else
  227.                 {
  228.                     MessageBox(GetFocus(),"movie info has no device id",
  229.                         "real bummer",MB_OK);
  230.                 }
  231.             }
  232.         }
  233.         else
  234.         {
  235.             MessageBox(pMovieInfo->hwndParent, "Unable to open Movie", NULL,
  236.                 MB_ICONEXCLAMATION|MB_OK);
  237.             pMovieInfo->fMovieOpen = FALSE;
  238.         }
  239.     }
  240.     InvalidateRect(pMovieInfo->hwndParent, NULL, FALSE);
  241.     UpdateWindow(pMovieInfo->hwndParent);
  242.     pMovieInfo->lLastSeek = 0;
  243. }
  244.  
  245. /*
  246.     playMovie -- looks at wDirection parameter and
  247.         sends MCI a MCI_PLAY command (optionally with
  248.             MCI_DGV_PLAY_REVERSE flag set) OR
  249.         sends MCI a MCI_PAUSE command
  250. */
  251. void playMovie(PMOVIEINFO pMovieInfo, WORD wDirection)
  252. {
  253.     pMovieInfo->fPlaying = !pMovieInfo->fPlaying;
  254.     if (wDirection == NULL)
  255.         pMovieInfo->fPlaying = FALSE;
  256.     if (pMovieInfo->fPlaying)
  257.     {
  258.         MCI_DGV_PLAY_PARMS   mciPlay;
  259.         DWORD dwFlags = MCI_NOTIFY;
  260.         
  261.         mciPlay.dwCallback = MAKELONG(pMovieInfo->hwndMovie,0);
  262.         mciPlay.dwFrom = mciPlay.dwTo = 0;
  263.         if (wDirection == 2)
  264.             dwFlags |= MCI_DGV_PLAY_REVERSE;
  265.             
  266.         mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_PLAY, dwFlags,
  267.             (DWORD)(LPMCI_DGV_PLAY_PARMS)&mciPlay);
  268.     }
  269.     else
  270.     {
  271.         MCI_DGV_PAUSE_PARMS  mciPause;
  272.         
  273.         mciSendCommand(pMovieInfo->wMCIDeviceID,MCI_PAUSE,MCI_WAIT,
  274.             (DWORD)(LPMCI_DGV_PAUSE_PARMS)&mciPause);
  275.     }
  276. }
  277.  
  278. /*
  279.     setMovie -- stops movie if it is playing,
  280.         sends MCI an MCI_SEEK command to the frame number passed in.
  281. */
  282. void setMovie(PMOVIEINFO pMovieInfo, DWORD dwFrame, HWND hCallback)
  283. {
  284.     MCI_SEEK_PARMS mciSeek;
  285.     
  286.     if (pMovieInfo->fPlaying)
  287.     {
  288.         playMovie(pMovieInfo, NULL);
  289.     }
  290.     mciSeek.dwTo = dwFrame;
  291.     mciSeek.dwCallback = MAKELONG(pMovieInfo->hwndMovie,0);
  292.     
  293.     mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT,
  294.         (DWORD)(LPMCI_SEEK_PARMS)&mciSeek);
  295.     pMovieInfo->lLastSeek = dwFrame;
  296. }
  297.  
  298. /*
  299.     seekMovie -- stops movie if playing, then goes to beginning or
  300.         end of movie. wAction == 0 means beginning, == 1 means end.
  301.         it does this my using MCI_SEEK with MCI_SEEK_TO_START or
  302.         MCI_SEEK_TO_END.
  303. */
  304. void seekMovie(PMOVIEINFO pMovieInfo, WORD wAction)
  305. {
  306.     if (pMovieInfo->fPlaying)
  307.     {
  308.         playMovie(pMovieInfo, NULL);
  309.     }
  310.     if (wAction == 0)
  311.     {
  312.         mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_SEEK, MCI_SEEK_TO_START,
  313.             (DWORD)(LPVOID)NULL);
  314.         pMovieInfo->lLastSeek = 0;
  315.     }
  316.     else if (wAction == 1)
  317.     {
  318.         mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_SEEK, MCI_SEEK_TO_END,
  319.             (DWORD)(LPVOID)NULL);
  320.     }
  321. }
  322.  
  323. /*
  324.     stepMovie -- stops movie if playing, then steps one frame:
  325.         wDirection == MCI_STEP means forward, anything else means reverse.
  326.         it does this by using MCI_STEP command with MCI_DGV_STEP_FRAMES,
  327.         optionally with MCI_DGV_STEP_REVERSE flag set.
  328. */
  329. void stepMovie(PMOVIEINFO pMovieInfo, HWND hWnd, WORD wDirection)
  330. {
  331.     MCI_DGV_STEP_PARMS   mciStep;
  332.     
  333.     if (pMovieInfo->fPlaying)
  334.         playMovie(pMovieInfo, NULL);
  335.  
  336.     mciStep.dwFrames = 1L;
  337.  
  338.     if (wDirection == MCI_STEP)
  339.     {
  340.         mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES,
  341.             (DWORD)(LPMCI_DGV_STEP_PARMS)&mciStep);
  342.     }
  343.     else
  344.     {
  345.         mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_STEP,
  346.             MCI_DGV_STEP_FRAMES|MCI_DGV_STEP_REVERSE,
  347.             (DWORD)(LPMCI_DGV_STEP_PARMS)&mciStep);
  348.     }
  349. }
  350.